package com.medsys.dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;

import com.medsys.model.Paciente;

/**
 * Classe respos�vel pela persistencia de dados da classe {@link Paciente}.
 * @author Felipe Lauksas
 *
 */
public class PacienteDAO extends BaseDAO {
	/**
	 * Contrutor com parametro da sess�o j� iniciada
	 * @param session criada por {@link DAOFactory}.
	 */
	public PacienteDAO(Session session) {
		super(session);		
	}	
	
	/**
	 * M�todo para salvar um objeto do tipo {@link Paciente} no banco de dados.
	 * @param paciente do tipo {@link Paciente}.
	 * @return {@link Paciente} persistido.
	 * @throws Exception
	 */
	public Paciente salvar (Paciente paciente) throws Exception{
		try {
			paciente = (Paciente) this.session.merge(paciente);
		} catch (HibernateException e) {			
			throw new Exception(e);
		}
		return paciente;
	}
	/**
	 * M�todo para alterar um objeto do tipo {@link Paciente} no banco de dados.
	 * @param paciente do tipo {@link Paciente}.
	 * @throws Exception
	 */
	public void alterar(Paciente paciente) throws Exception{
		try {
			this.session.update(paciente);
		} catch (HibernateException e) {			
			throw new Exception(e);
		}
	}
	/**
	 * M�todo para listar todos os objetos do tipo {@link Paciente} existentes no banco de dados.
	 * @return {@link List} com objetos {@link Paciente}.
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public List<Paciente> listarTodos() throws Exception{
		List<Paciente> listPacientes = null;
		try {
			
			Query query = this.session.createQuery("select p from Paciente p order by p.nome");
			
			//listPacientes = this.session.createCriteria(Paciente.class).list();
			
			listPacientes = query.list();
			
		} catch (HibernateException e) {			
			throw new Exception(e);
		}
		return listPacientes;
	}	
	
	public Paciente listarHitoricoMedicoPaciente(Long id) throws Exception{		
		
		Paciente paciente = null;
		
		try {		
			
			Query  query = this.session.createQuery("select p from Paciente p left outer join fetch p.listCosultas where p.id = "+id);
			paciente = (Paciente) query.uniqueResult();
			
		} catch (HibernateException e) {	
			
			throw new Exception(e);
		}
		return paciente;
	} 
	
	/**
     * Pesquisa um paciente pela sua chave
     * @param Integer id
     * @return {@link Paciente} paciente
     */
    public Paciente pesquisarPorId(Serializable id)throws Exception{      
    	
    	Paciente paciente = null;
    	
    	try {
			
			paciente = (Paciente) this.session.get(Paciente.class, id);
			
		} catch (HibernateException e) {	
			
			throw new Exception(e);
		}
    	
        return paciente;
    }
    
    /**
     * Pesquisa um Paciente pelo CPF
     * @param crm
     * @return {@link Paciente} paciente
     */
    public Paciente pesquisarPorCpf(String cpf)throws Exception{  
    	
    	Paciente paciente = null;
    	
    	try {
			
    		Query query = this.session.createQuery("select p from Paciente p where p.cpf = \'"+cpf+ "\'");
			paciente = (Paciente) query.uniqueResult();
			
		} catch (HibernateException e) {	
			
			throw new Exception(e);
		}
    	
        return paciente;    
     
    }
    
}
